'use strict';

let {Sequelize, DataTypes}=require('sequelize');
let {database,username,password,host,dialect}=require('./config')//登入数据库定义的具体数据

// 初始化sequelize实例，注意Sequelize和sequelize的大小写区别
let sequelize=new Sequelize(database,username,password,{
    host:host,
    dialect:dialect
});
//已经用config.js引入的数据登入了数据库
// 定义一个方法，用来统一模型定义
function defineModel(name,attrs){
    let prop={};
//表id
    prop.id={
        type:DataTypes.BIGINT,
        primaryKey:true,
        autoIncrement:true
    }

    for(let key in attrs){
        let value=attrs[key];
        prop[key]=value;
    }
//创建表时间
    prop.createdAt={
        type:DataTypes.BIGINT,
        allowNull:false
    };//修改表时间
    prop.updatedAt={
        type:DataTypes.BIGINT,
        allowNull:false
    };
  
//以上代表必须要有的，后续使用这个函数可以再添加
    let User=sequelize.define(name,prop,{
        tableName:name,
        timestamps:false,//除去系统自动生成的时间按我们设置的来
        // 定义勾子
        hooks:{
            // 在数据插入时，在对将要插入的数据进行验证之前（能否为空、默认值、是否唯一等约束进行验证的时候）
            beforeValidate:function(obj){
                // 生成一个时间戳
                let nw=Date.now();
                // 如果是新插入数据，则创建时间和更新时间一样，并且版本设置为0；如果是更新数据，则更新时间重新赋值，并对版本自增1
                if(obj.isNewRecord){
                    obj.createdAt=nw;
                    obj.updatedAt=nw;
                  
                }else{
                    obj.updatedAt=nw;
                   
                }
            }
        }
    });


    return User;
}

// 准备将Sequelize的一个实例、模型定义方法、数据类型
let obj={
    sequelize,
    defineModel,
    DataTypes
}

// 暴露这个对象
module.exports=obj;
//备注
